package dynamic_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 定义个创建代理类的方法，这个方法必须实现InvocationHandler这个接口
 */
public class CreateProxy implements InvocationHandler {

    private  Object target;      //动态代理的对象
    /**
     * 功能：创建一个代理对象
     * target:传进来的对象参数
     * target.getClass() getClassLoader(): 加载这个代理对象的类加载器
     * target.getClass().getInterfaces(): 这个对象所实现的接口
     * @return 返回一个代理对象
     */
    public Object  CreateProxy(Object target){
        this.target = target;
        Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), this);
        return proxy;
    }

    /**
     * 功能：代理者会自动调用这个invoke方法（代理者执行的方法）
     * @param proxy   生成的代理类对象
     * @param method  被代理对象的方法
     * @param args     被代理对象方法的参数
     * @return 返回方法执行后的返回值
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println("代理商发布卖房者的卖房信息");
        System.out.println("找到买家，准备进行交易");
        method.invoke(target,args);  //执行被代理对象的方法，有返回值的会返回一个返回值
        return null;
    }

}
